home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / cgraphix / axis.c < prev    next >
Text File  |  1986-05-26  |  6KB  |  228 lines

  1. /* «RM120»«PL99999»«TS4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76» «MDBO»from axis.hgh «MDNM»*/
  2. #include    <stdio.h>
  3. #define    EXTERN    extern
  4. #include    <typedef.h>
  5.  
  6. extern double    log10();
  7. extern double    pow();
  8. extern double    fabs();
  9.  
  10. double        s, Fract;
  11.  
  12.  
  13. static int GetExponent(X1)
  14. double    X1;
  15. {
  16.     if (X1 == 0.)
  17.         return(0);
  18.     else if (fabs(X1) >= 1.)
  19.         return((int)(.01 + log10(fabs(X1))));
  20.     else
  21.         return(-(int)(.01 + log10(fabs(X1))));
  22. }
  23.  
  24.  
  25. static void DrawNum(x1, y1, MaxExponent, Number)
  26. int        x1, y1, MaxExponent;
  27. double    Number;
  28. {
  29.     register int    i;
  30.     WrkString        StrNumber;
  31.     double            t;
  32.  
  33.     sprintf(StrNumber, "%5.2lf", Number * pow(10., -(double)MaxExponent));
  34.     y1 = y1 - 3;
  35.     for (i = 0; i < 5; i++)
  36.         DrawAscii(&x1, &y1, 1, StrNumber[i]);
  37. }
  38.  
  39. static int Balance()
  40. {
  41.     s = s + Fract;
  42.     if (s >= 0) {
  43.       s = s - 1.0;
  44.       return(1);
  45.     }
  46.     else
  47.         return(0);
  48. }
  49.  
  50.  
  51. static void DrawExponent(x1,y1,MaxExponent)
  52. int        x1, y1, MaxExponent;
  53. {
  54.     int        i;
  55.     WrkString    StrNumber;
  56.  
  57.     y1 = y1-3;
  58.     x1 = x1+1;
  59.     DrawAscii(&x1, &y1, 1, 49);
  60.     DrawAscii(&x1, &y1, 1, 48);
  61.     sprintf(StrNumber, "%3d", MaxExponent);
  62.     y1 = y1-3;
  63.     x1 = x1-7;
  64.     for (i = 0; i < 3; i++)
  65.         DrawAscii(&x1, &y1, 1, StrNumber[i]);
  66. }
  67.  
  68.  
  69. void DrawAxis(XDens,YDens,XLeft,YTop,XRight,YBottom,XAxis,YAxis,Arrows)
  70. int        XDens,YDens,XLeft,YTop,XRight,YBottom,XAxis,YAxis,Arrows;
  71. {
  72.     register int    i;
  73.  
  74.     int        LineStyleLoc,xk0,yk0,xk1,yk1,xk2,yk2;
  75.     int        x2,y2,MaxExponentX,MaxExponentY,ys,xs,Delta,NPoints;
  76.     double    Difference,Number,s,Fract;
  77.     int        X1RefLoc,X2RefLoc,Y1RefLoc,Y2RefLoc;
  78.     int        X1RefLoc2,X2RefLoc2,Y1RefLoc2,Y2RefLoc2;
  79.     int        ClippingLoc,DirectModeLoc,HeaderLoc;
  80.  
  81.  
  82.     LineStyleLoc = LineStyleGlb;
  83.     SetLineStyle(0);
  84.     DirectModeLoc = DirectModeGlb;
  85.     DirectModeGlb = TRUE;
  86.  
  87.     X1RefLoc = window[WindowNdxGlb].x1;
  88.     X2RefLoc = window[WindowNdxGlb].x2;
  89.     Y1RefLoc = window[WindowNdxGlb].y1;
  90.     Y2RefLoc = window[WindowNdxGlb].y2;
  91.     ReDefineWindow(WindowNdxGlb, window[WindowNdxGlb].x1+XLeft,
  92.         window[WindowNdxGlb].y1+YTop, window[WindowNdxGlb].x2-XRight,
  93.         window[WindowNdxGlb].y2-YBottom);
  94.     SelectWindow(WindowNdxGlb);
  95.  
  96.     if ((XDens < 0) ^ (YDens < 0)) {
  97.         HeaderLoc = HeaderGlb;
  98.         HeaderGlb = FALSE;
  99.         DrawBorder();
  100.         HeaderGlb = HeaderLoc;
  101.     }
  102.  
  103.     XDens = iabs(XDens);
  104.     YDens = iabs(YDens);
  105.     if (XDens > 9)
  106.         XDens = 0;
  107.     if (YDens > 9)
  108.         YDens = 0;
  109.     xk0 = (X1RefGlb+4) << 3;
  110.     yk0 = Y2RefGlb - 14;
  111.     yk1 = Y1RefGlb + 6;
  112.     xk1 = xk0;
  113.     yk2 = yk0;
  114.     xk2 = (X2RefGlb << 3) - 9;
  115.     if ((XAxis >= 0) || (YAxis >= 0)) {
  116.         ClippingLoc = ClippingGlb;
  117.         ClippingGlb = TRUE;
  118.         X1RefLoc2 = window[WindowNdxGlb].x1;
  119.         X2RefLoc2 = window[WindowNdxGlb].x2;
  120.         Y1RefLoc2 = window[WindowNdxGlb].y1;
  121.         Y2RefLoc2 = window[WindowNdxGlb].y2;
  122.         ReDefineWindow(WindowNdxGlb,X1RefLoc2+4,Y1RefLoc2+6,X2RefLoc2-2,
  123.             Y2RefLoc2-14);
  124.         SelectWindow(WindowNdxGlb);
  125.         DirectModeGlb = FALSE;
  126.         if (XAxis >= 0) {
  127.             SetLineStyle(XAxis);
  128.             DrawLine((double)X1WldGlb, (double)Y1WldGlb+Y2WldGlb,
  129.                 (double)X2WldGlb, (double)Y1WldGlb+Y2WldGlb);
  130.             SetLineStyle(0);
  131.         }
  132.         if (YAxis >= 0) {
  133.             SetLineStyle(YAxis);
  134.             DrawLine(0., (double)Y1WldGlb, 0., (double)Y2WldGlb);
  135.             SetLineStyle(0);
  136.         }
  137.         ClippingGlb = ClippingLoc;
  138.         DirectModeGlb = TRUE;
  139.         ReDefineWindow(WindowNdxGlb,X1RefLoc2,Y1RefLoc2,X2RefLoc2,Y2RefLoc2);
  140.         SelectWindow(WindowNdxGlb);
  141.     }
  142.     if (YDens >= 2) {
  143.         DrawLineDirect(xk0, yk0, xk1, yk1);
  144.         if (Arrows) {
  145.             DrawLineDirect(xk0, yk1, xk0 - 4, yk1 + 4);
  146.             DrawLineDirect(xk0, yk1, xk0 + 4, yk1 + 4);
  147.             dp(xk0, yk1 - 1);
  148.         }
  149.     }
  150.     if (XDens >= 2) {
  151.         DrawLineDirect(xk0, yk0, xk2 + 1, yk2);
  152.         if (Arrows) {
  153.             DrawLineDirect(xk2, yk2, xk2 - 4, yk2 - 4);
  154.             DrawLineDirect(xk2, yk2, xk2 - 4, yk2 + 4);
  155.         }
  156.     }
  157.  
  158.     if ((iabs(yk0-yk1) >= 35) && (iabs(xk2-xk1) >= 150)) {
  159.         DrawLineDirect(xk0, yk0, xk0 - 4, yk0);
  160.         DrawLineDirect(xk0, yk0, xk0, yk0 + 4);
  161.         Delta = Y2RefGlb-Y1RefGlb-20;
  162.         NPoints = (int)(Delta / 7.);
  163.         if (YDens >= 4) {
  164.             if (fabs(Y2WldGlb) > fabs(Y1WldGlb))
  165.                 MaxExponentY = GetExponent(Y2WldGlb);
  166.             else
  167.                 MaxExponentY = GetExponent(Y1WldGlb);
  168.             DrawNum(X1RefGlb << 3, yk0+1, MaxExponentY, Y1WldGlb);
  169.             if (MaxExponentY != 0)
  170.                 DrawExponent((X1RefGlb << 3) + 1, yk1 + 2, MaxExponentY);
  171.         }
  172.         Fract = Delta / (double)NPoints - 7.;
  173.         s = -Fract;
  174.         ys = yk0;
  175.         Difference = (Y2WldGlb - Y1WldGlb) / NPoints;
  176.         for (i = 1; i <= NPoints; i++) {
  177.             ys = ys-7-Balance();
  178.             if ((YDens > 2) && (ys > Y1RefGlb+13)) {
  179.                 Number = Y1WldGlb + i * Difference;
  180.                 DrawLineDirect(xk0, ys, xk0 - 4, ys);
  181.                 if ((YDens >= 4) && ((i % (10-YDens)) == 0))
  182.                     DrawNum(X1RefGlb << 3, ys + 1, MaxExponentY, Number);
  183.             }
  184.         }
  185.         if (XDens >= 4) {
  186.             if (fabs(X2WldGlb) > fabs(X1WldGlb))
  187.                 MaxExponentX = GetExponent(X2WldGlb);
  188.             else
  189.                 MaxExponentX = GetExponent(X1WldGlb);
  190.             DrawNum(xk0 - 14, yk0 + 10, MaxExponentX, X1WldGlb);
  191.             if (MaxExponentX != 0)
  192.                 DrawExponent(xk2 - 13, yk0 + 10, MaxExponentX);
  193.         }
  194.         Delta = iabs(X2RefGlb-X1RefGlb) * 8 - 41;
  195.         NPoints = (int)(Delta / 30.);
  196.         Fract = (Delta - NPoints * 31) / (double)NPoints;
  197.         s = -Fract;
  198.         xs = xk0 - 1;
  199.         Difference = (X2WldGlb-X1WldGlb) / NPoints;
  200.         for (i = 1; i <= NPoints; i++) {
  201.             xs = xs + 30 + Balance();
  202.             if ((XDens > 2) && (xs < (X2RefGlb << 3) - 17)) {
  203.                 Number = X1WldGlb + i * Difference;
  204.                 DrawLineDirect(xs, yk0, xs, yk0 + 4);
  205.                 if ((XDens>=4) && ((i % (10-XDens)) == 0))
  206.                     DrawNum(xs - 14, yk0 + 10, MaxExponentX, Number);
  207.             }
  208.         }
  209.     }
  210.     ReDefineWindow(WindowNdxGlb,X1RefLoc,Y1RefLoc,X2RefLoc,Y2RefLoc);
  211.     SelectWindow(WindowNdxGlb);
  212.     DirectModeGlb = DirectModeLoc;
  213.     SetLineStyle(LineStyleLoc);
  214.     AxisGlb  =  TRUE;
  215.     X1Glb  =  XLeft;
  216.     X2Glb  =  XRight;
  217.     Y1Glb  =  YTop;
  218.     Y2Glb  =  YBottom;
  219. }
  220.  
  221.  
  222. void ResetAxis()
  223. {
  224.     AxisGlb  =  TRUE;
  225. }
  226.  
  227.  
  228.